#!/usr/bin/python
# -*- coding: utf-8 -*-

'''''テキスト解析。入力が「文章」「検索結果」のモジュール'''


import re
import urllib
from .. import Util

#Yahoo形態素解析API
class YahooKeitaisoAnalyzer:
    def __init__(self):
        '''
        #Filter
        # 1 : 形容詞
        # 2 : 形容動詞
        # 3 : 感動詞
        # 4 : 副詞
        # 5 : 連体詞
        # 6 : 接続詞
        # 7 : 接頭辞
        # 8 : 接尾辞
        # 9 : 名詞
        # 10 : 動詞
        # 11 : 助詞
        # 12 : 助動詞
        # 13 : 特殊文字

        #使用例
        from yi01lib.LangProcess import TextAnalyzer
        
        yk=TextAnalyzer.YahooKeitaisoAnalyzer()
        yk.Filter="1|9"
        for word,detail in yk.Analyze(u"庭には二羽にわとりがいる").iteritems():
            print word,detail

        '''        
        
        self._apiKey=Util.API_Key["YahooJapan"]
        self.Filter="1|9"

    def Analyze(self,unicodedSentence):
        url="http://jlp.yahooapis.jp/MAService/V1/parse"
        sentence=unicodedSentence.encode("utf-8")
        query={
            "appid":self._apiKey
            ,"results":"uniq"
            ,"response":"surface,pos"
            ,"filter":self.Filter
            ,"uniq_by_baseform":"true"
            ,"sentence":sentence
            }
        
        #ダウンロード
        xml=Util.Download(url,urllib.urlencode(query))
        
        mUniqResult=re.compile('<uniq_result>(.*?)</uniq_result>',re.M|re.S).search(xml)

        
        if mUniqResult is None:
            return dict()
        else:
            uniqResult=mUniqResult.group(1)
            
            WordCollection=dict()
            
            for mWord in re.compile('<word>(.*?)</word>',re.M|re.S).finditer(uniqResult):
                if mWord is None: continue
                wordXML=mWord.group(1)
                
                m=re.compile('<surface>([^>]*)</surface>').search(wordXML)
                surface=m.group(1)
                
                m=re.compile('<pos>([^>]*)</pos>').search(wordXML)
                pos="" if m is None else m.group(1)
                
                m=re.compile('<baseform>([^>]*)</baseform>').search(wordXML)
                baseform=surface if m is None else m.group(1)
                
                m=re.compile('<count>([0-9]+)</count>').search(wordXML)
                count=int(m.group(1))
                
                WordCollection[unicode(baseform,"utf-8")]={"count":count,"POS":unicode(pos,"utf-8")}
            return WordCollection

        
#正規表現による適当なトークン化
class RegexTokenizer:
    '''
    #漢字とカタカナのトークンを切り出す例
    from yi01lib.LangProcess import TextAnalyzer
    from yi01lib import Util
    
    rt=TextAnalyzer.RegexTokenizer(TextAnalyzer.RegexTokenizer.KANJI|TextAnalyzer.RegexTokenizer.KATAKANA)
    for word,c in rt.Analyze(u"ようこそphpspotへ！当サイトではフリーのwindows用php開発環境であるＰＨＰエディタ forWin や、フリーのＰＨＰスクリプト( PHP掲示板,webshot,webimager,CMS 等 )、ＰＨＰツールバー、テレビバー、便利検索バー(Yahoo,Google,辞典検索)などを配布しています。その他、ＰＨＰ入門 や ＰＨＰ５ーＴＩＰＳ、ＰＨＰサンプル集、MySQL解説、ＰＨＰレンタルサーバー特集などのコーナーもあります。").iteritems():
        print Util.JapaneseConsole(word),c["count"]

    '''
    ALPHANUMERIC=1
    KATAKANA=2
    HIRAGANA=4
    KANJI=8

    def __init__(self,parseFlag=15):
        self.parseFlag=parseFlag
    def Analyze(self,unicodedSentence):
        regex=u""
        
        if self.parseFlag%2==1:
            regex+=u"|[a-zA-Z0-9]+|[ａ-ｚＡ-Ｚ０-９]+"
        self.parseFlag>>=1
        if self.parseFlag%2==1:
            regex+=u"|[ァ-ヴー]+"
        self.parseFlag>>=1
        if self.parseFlag%2==1:
            regex+=u"|[ぁ-ん]+"
        self.parseFlag>>=1
        if self.parseFlag%2==1:
            regex+=u"|[一-龠]+"

            
        if len(regex)==0:
            return dict()

        regex=regex[1:]

        res=dict()
        
        for mToken in re.compile(regex,re.M|re.S).finditer(unicodedSentence):
            if mToken is None : continue
            
            token=mToken.group()
            if not res.has_key(token):
                res[token]={"count":1}
            else:
                res[token]["count"]+=1
        return res
##正規表現による適当なトークン化
#class RegexTokenizer2:
    #def __init__(self):
        #pass
    #def __searchCount(self,subject,needle):
        #c=0
        #s=subject
        #while needle in s:
            #c+=1
            #s=s[s.index(needle)+len(needle):]
        #return c
    #def Analyze(self,unicodedSentence):
        #regex=u"[a-zA-Z0-9]+|[ａ-ｚＡ-Ｚ０-９]+|[ァ-ヴー]+|[ぁ-ん]+|[一-龠]+"
        #res=dict()
        #prev=None
        #c1=c2=c12=0
        #for mToken in re.compile(regex,re.M|re.S).finditer(unicodedSentence):
            #token=mToken.group()
            #if prev is None:
                #prev=token
                #c1=self.__searchCount(unicodedSentence,prev)
                #continue
            #c2=self.__searchCount(unicodedSentence,token)
            #c12=self.__searchCount(unicodedSentence,prev+token)
            ##print c1,c2,c12
            #if c12>0.7*c2 and c12>0.7*c1:
                #prev=prev+token
                #c1=c12
            #else:
                #if not res.has_key(prev):
                    #res[prev]={"count":1}
                #else:
                    #res[prev]["count"]+=1
                #prev=token
                #c1=c2
        #if prev!="":
            #if not res.has_key(prev):
                #res[prev]={"count":1}
            #else:
                #res[prev]["count"]+=1
            
        #return res


#検索結果のDF
def DFofSearchResult(searchResults,unicodedTermList=None,useYahoo=False,inTitleScore=1,inDescriptionScore=1):
    '''
    検索結果から、それぞれの単語の出現頻度を求める。
    termListが与えられたら、それらをカウント。なければ、形態素解析にかけて、すべての単語をカウント。
    '''
    dfCnt=dict()
    if unicodedTermList is None:
        if not useYahoo:
            #termListが設定されていなければTokenizeで取得。
            sentences=u"\n".join((result.Title+u"\n"+result.Description for result in searchResults))
            tokenizer=RegexTokenizer()
            unicodedTermList=list()
            for term,d in tokenizer.Analyze(sentences).iteritems():
                if dfCnt.has_key(term):continue
                dfCnt[term]=0
                unicodedTermList.append(term)

    
        else:
            #termListが設定されていなければYahoo形態素解析で取得。
            sentences=""
            yahooKeitaiso=YahooKeitaisoAnalyzer()
            unicodedTermList=list()
            for result in searchResults:
                resSentence=result.Title+u"\n"+result.Description+u"\n"
                if len(sentences)+len(resSentence) >10000:
                    #形態素解析
                    for term in yahooKeitaiso.Analyze(sentences).iterkeys():
                        if dfCnt.has_key(term):continue
                        else:
                            dfCnt[term]=0
                            unicodedTermList.append(term)
                    sentences=""
                sentences+=resSentence
                #形態素解析
                for term in yahooKeitaiso.Analyze(sentences).iterkeys():
                    if dfCnt.has_key(term):continue
                    else:
                        dfCnt[term]=0
                        unicodedTermList.append(term)
    else:
        for k in unicodedTermList:
            dfCnt[k]=0
    
    for result in searchResults:
        for t in unicodedTermList:
            #タイトルに出現
            if t in result.Title:
                dfCnt[t]+=inTitleScore
            #スニペットに出現
            if t in result.Description:
                dfCnt[t]+=inDescriptionScore
    return dfCnt
